Logotipo da disciplina PAG014903

Fundamentos de Programação em Python

v0.0.2

Padrão

Estruturas de Dados Essenciais com Python

Agrupe informações, simule tabelas de atributos e prepare coleções versáteis para fluxos de análise geoespacial.

Você vai aprender a

  • Representar atributos e tabelas em memória usando listas e dicionários.
  • Aplicar funções de agregação e ordenação para priorizar dados.
  • Evitar erros comuns ao lidar com coleções reais.

Estruturas de dados essenciais com Python

Depois de dominar variáveis individuais, o próximo passo é organizar conjuntos de informações. Listas, dicionários e conjuntos representam coleções flexíveis que simulam tabelas de atributos, resultados de sensores ou lotes de coordenadas.

Essas estruturas permitem automatizar etapas inteiras do fluxo de trabalho: higienizar dados antes da importação para o QGIS, gerar estatísticas rápidas ou converter registros para GeoJSON. Ao final, você terá uma base sólida para trabalhar com formatos tabulares e geoespaciais.

2.1 Listas: gaveteiros ordenados

Listas são coleções ordenadas e mutáveis. São ideais para guardar sequências de medições, nomes de camadas ou qualquer conjunto que precise de posição.

Em Python, criamos listas com colchetes e vírgulas separando elementos.

# A variável 'ids_setores' recebe três identificadores de setores censitários
ids_setores = ["4205407_0001", "4205407_0002", "4205407_0003"]

# Lista com medições de altura de postes
tamanhos_postes = [8.5, 9.0, 8.5, 8.75]

# Listas podem misturar tipos de dados
ponto_ifsc = ["Vértice 1", "Metálico", -27.425634, -48.54352523]

2.1.1 Indexação e slicing

A contagem começa em zero. Índices negativos caminham pelo fim da lista e o slicing retorna subconjuntos contínuos.

# Indexação direta
primeiro_id = ids_setores[0]
ultimo_id = ids_setores[-1]

# Slicing: recortes de listas
coordenadas = ponto_ifsc[2:4]
dois_primeiros = ids_setores[:2]

print(primeiro_id, ultimo_id, coordenadas, dois_primeiros)

2.1.2 Métodos úteis

Os métodos nativos tornam fácil adicionar, remover ou reordenar itens.

camadas = ["rios", "estradas", "limite_municipal"]

camadas.append("curvas_de_nivel")   # Adiciona ao final
camadas.insert(1, "vegetacao")      # Insere na posição 1
ultima = camadas.pop()               # Remove e retorna o último item
camadas.remove("estradas")          # Remove pelo conteúdo

print(camadas)
print(f"Camada removida: {ultima}")

2.1.3 Funções de agregação

Resuma coleções numéricas para apoiar decisões e comunicar resultados.

populacoes = [750, 1200, 900, 450, 1500]

soma_total = sum(populacoes)
minima = min(populacoes)
maxima = max(populacoes)
media = soma_total / len(populacoes)

print(soma_total, minima, maxima, f"{media:.2f}")

Dica do professor

Antes de importar dados para o QGIS, organize as listas de atributos em Python seguindo a mesma ordem das colunas que você espera visualizar no software. Isso facilita a criação de CSVs consistentes e reduz erros ao cruzar informações.

2.2 Dicionários: fichários por etiqueta

Dicionários usam chaves para acessar valores. São ideais para representar atributos de uma feição.

setor = {
    "id": "4205407_0001",
    "pop": 750,
    "area_km2": 0.35
}

2.2.1 Inserção e atualização

setor["densidade"] = setor["pop"] / setor["area_km2"]  # Cria nova chave
setor["pop"] = 820                                        # Atualiza valor
removido = setor.pop("area_km2")                          # Remove e retorna

print(setor)
print(f"Área removida: {removido}")

2.2.2 Acessos seguros

setor = {"id": "SC_FLO_0001", "pop": 820, "distrito": "Centro"}

if "bairro" in setor:
    print(setor["bairro"])
else:
    print("Bairro ausente")

bairro = setor.get("bairro", "(não informado)")
print(bairro)

Atenção aos dados reais

Dados vindos de planilhas ou serviços externos costumam trazer campos vazios ou formatos inesperados. Valide a existência de chaves e converta tipos numéricos antes de fazer contas; isso evita travamentos do script em produções longas.

2.3 Tabela em memória: lista de dicionários

Combine listas e dicionários para simular tabelas completas em memória, mantendo legibilidade.

setores = [
    {"id": "4205407_0001", "pop": 750, "area_km2": 0.35},
    {"id": "4205407_0002", "pop": 1200, "area_km2": 0.42},
    {"id": "4205407_0003", "pop": 900, "area_km2": 0.25},
]

pop_segundo = setores[1]["pop"]
pop_total = [s["pop"] for s in setores]
media = sum(pop_total) / len(pop_total)

print(pop_segundo)
print(pop_total)
print(f"Média: {media:.2f}")

2.4 De tabela a camada: padrão GeoJSON

Use dicionários aninhados para representar feições completas, incluindo geometria.

feature = {
    "type": "Feature",
    "geometry": {
        "type": "Point",
        "coordinates": [-48.5435, -27.4256]
    },
    "properties": {
        "id": "4205407_0001",
        "nome": "IFSC Mauro Ramos"
    }
}

print(feature["geometry"]["type"])
print(feature["geometry"]["coordinates"])
print(feature["properties"])

2.5 Ordenação de dados

O parâmetro key combinado a sorted() gera rankings customizados.

setores = [
    {"id": "4205407_0001", "pop": 750, "area_km2": 0.35},
    {"id": "4205407_0002", "pop": 1200, "area_km2": 0.42},
    {"id": "4205407_0003", "pop": 900, "area_km2": 0.25},
]

for setor in setores:
    setor["dens"] = setor["pop"] / setor["area_km2"] if setor["area_km2"] > 0 else 0

ranking = sorted(setores, key=lambda s: s["dens"], reverse=True)

for posicao, setor in enumerate(ranking, start=1):
    print(f"{posicao}º - {setor['id']} · {setor['dens']:.1f} hab/km²")
Curiosidade: CSV ou JSON?

Para dados exclusivamente tabulares, CSV é leve e amplamente aceito. Quando a estrutura exige aninhamento, o JSON (ou GeoJSON) torna-se mais eficiente. Em Python, basta alternar entre listas de dicionários e dicionários aninhados para migrar entre esses formatos sem dores.

2.6 Conjuntos (set)

Conjuntos descartam duplicatas automaticamente e são úteis para obter categorias únicas.

rotulos = ["NEIM", "EMEF", "NEIM", "EMEB", "EMEF", "NEIM"]

rotulos_unicos = set(rotulos)
lista_ordenada = sorted(rotulos_unicos)

print(rotulos)
print(rotulos_unicos)
print(lista_ordenada)

2.7 Pontos de atenção

Conheça os erros mais frequentes ao manipular coleções e prepare soluções.

KeyError

  • Verifique com if chave in dicionario.
  • Use dicionario.get("chave", "valor padrão").

TypeError

  • Converta explicitamente valores importados.
  • Valide tipos antes de calcular.

ZeroDivisionError

  • Teste se o denominador é maior que zero.
  • Defina valores seguros (0) quando necessário.

IndexError

  • Garanta limites com len(lista).
  • Proteja acessos em laços com verificações.

2.8 Exercícios práticos

Execute os desafios para fixar os conceitos e adaptar aos seus dados.

1. Slicing & append

Crie uma lista de IDs, recorte os dois primeiros, adicione um novo valor e exiba o total.

ids = ["4205407_0001", "4205407_0002", "4205407_0003"]
print(ids[:2])
ids.append("4205407_0004")
print(len(ids))

2. Campo derivado

Calcule densidades populacionais e registre o resultado em cada dicionário.

setores = [
    {"id": "4205407_0001", "pop": 750, "area_km2": 0.35},
    {"id": "4205407_0002", "pop": 1200, "area_km2": 0.42},
    {"id": "4205407_0003", "pop": 900, "area_km2": 0.25},
]

densidades = []
for setor in setores:
    if setor["area_km2"] > 0:
        dens = setor["pop"] / setor["area_km2"]
        setor["dens"] = dens
        densidades.append(dens)
    else:
        setor["dens"] = 0

print(max(densidades))
print(setores)

3. Ranking por densidade

Ordene os setores por densidade e retorne os dois primeiros IDs.

ranking = sorted(setores, key=lambda s: s["dens"], reverse=True)
top2 = [s["id"] for s in ranking[:2]]
print(top2)

Conclusão

Listas, dicionários e conjuntos formam a base para manipular estruturas complexas em Python. Você agora consegue representar atributos, gerar estatísticas e preparar dados para formatos como CSV e GeoJSON.

No próximo capítulo, exploraremos decisões e laços para tornar esses dados dinâmicos e automatizar fluxos inteiros.